package com.andong.utils;

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
/**
 * 短信发送工具类
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class AliSMSUtils {
	private final AliSMSProperties aliSMSProperties;
	@Resource
	private RedisTemplate<String, String> redisTemplate;
	/**
	 * 发送短信
	 * @param phoneNumbers 手机号
	 * @param param 参数
	 */
	public void sendMessage(String phoneNumbers,String param) throws Exception {
		// 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用，仅供参考，建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378657.html
		Client client = createClient(aliSMSProperties.getAccessKeyId(), aliSMSProperties.getAccessKeySecret());
		SendSmsRequest sendSmsRequest = new SendSmsRequest()
				.setSignName(aliSMSProperties.getSignName())
				.setTemplateCode(aliSMSProperties.getTemplateCodeCode())
				.setPhoneNumbers(phoneNumbers)
				.setTemplateParam("{\"code\":" + param + "}");
		RuntimeOptions runtime = new RuntimeOptions();
		try {
			// 复制代码运行请自行打印 API 的返回值
			client.sendSmsWithOptions(sendSmsRequest, runtime);
		} catch (TeaException error) {
			// 如有需要，请打印 error
			Common.assertAsString(error.message);
		} catch (Exception _error) {
			TeaException error = new TeaException(_error.getMessage(), _error);
			// 如有需要，请打印 error
			Common.assertAsString(error.message);
		}
	}

	public void sendSuccess(String phoneNumbers,String name) throws Exception {
		// 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
		// 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用，仅供参考，建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378657.html
		Client client = createClient(aliSMSProperties.getAccessKeyId(), aliSMSProperties.getAccessKeySecret());
		SendSmsRequest sendSmsRequest = new SendSmsRequest()
				.setSignName(aliSMSProperties.getSignName())
				.setTemplateCode(aliSMSProperties.getTemplateCodeSuccess())
				.setPhoneNumbers(phoneNumbers)
				.setTemplateParam("{\"name\":" + "\"" + name + "\"" + "}");
		RuntimeOptions runtime = new RuntimeOptions();
		try {
			// 复制代码运行请自行打印 API 的返回值
			client.sendSmsWithOptions(sendSmsRequest, runtime);
		} catch (TeaException error) {
			// 错误 message
			System.out.println(error.getMessage());
			// 诊断地址
			System.out.println(error.getData().get("Recommend"));
			Common.assertAsString(error.message);
		} catch (Exception _error) {
			TeaException error = new TeaException(_error.getMessage(), _error);
			// 错误 message
			System.out.println(error.getMessage());
			// 诊断地址
			System.out.println(error.getData().get("Recommend"));
			Common.assertAsString(error.message);
		}
		log.info("已发送短信通知用户" + phoneNumbers + "注册成功！");
	}

	public void sendFile(String phoneNumbers,String name) throws Exception {
		System.out.println();
		// 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用，仅供参考，建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378657.html
		Client client = createClient(aliSMSProperties.getAccessKeyId(), aliSMSProperties.getAccessKeySecret());
		SendSmsRequest sendSmsRequest = new SendSmsRequest()
				.setSignName(aliSMSProperties.getSignName())
				.setTemplateCode(aliSMSProperties.getTemplateCodeFile())
				.setPhoneNumbers(phoneNumbers)
				.setTemplateParam("{\"name\":" + "\"" + name + "\"" + "}");
		RuntimeOptions runtime = new RuntimeOptions();
		try {
			// 复制代码运行请自行打印 API 的返回值
			client.sendSmsWithOptions(sendSmsRequest, runtime);
		} catch (TeaException error) {
			// 如有需要，请打印 error
			Common.assertAsString(error.message);
		} catch (Exception _error) {
			TeaException error = new TeaException(_error.getMessage(), _error);
			// 如有需要，请打印 error
			Common.assertAsString(error.message);
		}
		log.info("已发送短信通知用户" + phoneNumbers + "注册失败！");
	}

	public void sendLogout(String phoneNumbers,String name, String subjectName) throws Exception {
		System.out.println();
		// 工程代码泄露可能会导致 AccessKey 泄露，并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用，仅供参考，建议使用更安全的 STS 方式，更多鉴权访问方式请参见：https://help.aliyun.com/document_detail/378657.html
		Client client = createClient(aliSMSProperties.getAccessKeyId(), aliSMSProperties.getAccessKeySecret());
		SendSmsRequest sendSmsRequest = new SendSmsRequest()
				.setSignName(aliSMSProperties.getSignName())
				.setTemplateCode(aliSMSProperties.getTemplateCodeLogout())
				.setPhoneNumbers(phoneNumbers)
				.setTemplateParam("{\"name\":\"" + name + "\",\"subject\":\"" + subjectName + "\"}");
		RuntimeOptions runtime = new RuntimeOptions();
		try {
			// 复制代码运行请自行打印 API 的返回值
			client.sendSmsWithOptions(sendSmsRequest, runtime);
		} catch (TeaException error) {
			// 如有需要，请打印 error
			Common.assertAsString(error.message);
		} catch (Exception _error) {
			TeaException error = new TeaException(_error.getMessage(), _error);
			// 如有需要，请打印 error
			Common.assertAsString(error.message);
		}
	}
	public Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
		com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
				// 必填，您的 AccessKey ID
				.setAccessKeyId(accessKeyId)
				// 必填，您的 AccessKey Secret
				.setAccessKeySecret(accessKeySecret);
		// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
		config.endpoint = aliSMSProperties.getEndpoint();
		return new com.aliyun.dysmsapi20170525.Client(config);
	}

	public boolean checkCode(String phone, String code) {
		String realCode = redisTemplate.opsForValue().get(phone);
		System.out.println("realCode:" + realCode);
		System.out.println("code:" + code);
		if (realCode == null) {
			return false;
		}
		return realCode.equals(code);
	}
}
